package com.ws.demo.fibonacci;

import java.util.HashMap;
import java.util.Map;

public class Demo {

    /**
     * 写一个函数，输入 n ，求斐波那契（Fibonacci）数列的第 n 项（即 F(N)）。斐波那契数列的定义如下：
     * F(0) = 0,   F(1) = 1
     * F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
     */
    /**
     * 递归的方式
     */
//    public static int fib(int n) {
//        if (n == 0) return 0;
//        if (n == 1) return 1;
//        return fib(n - 1) + fib(n - 2);
//    }
    /**
     * 从下至上的 遍历 fib(n) = fib(n - 1) 前一个节点的值 + fib(n - 2) 前前节点
     */
//    public static int fib(int n) {
//        if (n == 0) return 0;
//        if (n == 1) return 1;
//        int a = 0;
//        int b = 1;
//        int c = 0;
//        for (int i = 2; i <= n; i++) {
//            c = a + b;
//            a = b;
//            b = c;
//        }
//        return c;
//    }

    /**
     * 将 fib(n) 执行过的值写入map 后续使用时 直接可以取值,而不需要重新计算
     */
//    static Map<Integer, Integer> map = new HashMap<>();
//    public static int fib(int n) {
//        if (n == 0) return 0;
//        if (n == 1) return 1;
//        if (map.containsKey(n)) {
//            return map.get(n);
//        } else {
//            int i = (fib(n - 1) + fib(n - 2)) % 1000000007;
//            map.put(n,i);
//            return i;
//        }
//    }

//    public static void main(String[] args) {
//        System.out.println(fib(6));
//    }
}
